/**
 * 创建两个子线程，一个是存钱（随机100-1000）, 一个取钱（随机100-1000）, 
 * 两个线程操作次数5次
*/

#include <stdio.h>
#include <sys/types.h>
#include <pthread.h>

#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>

// 定义共享数据
int balance = 0; // 余额

// 定义互斥锁
pthread_mutex_t mlock = PTHREAD_MUTEX_INITIALIZER;  // 静态初始化方式

void showCurrentTime(){
    // 显示当前时间
    // 1. 获取当前时间戳（当前时间与1900时间秒的差值）
    time_t t1 = time(NULL);
    // 2. 获取本地时间
    struct tm *current_tm= localtime(&t1);
    
    printf(
        "%d-%02d-%02d %02d:%02d:%02d ->",
        current_tm->tm_year + 1900,
        current_tm->tm_mon + 1,
        current_tm->tm_mday, 
        current_tm->tm_hour,
        current_tm->tm_min,
        current_tm->tm_sec
    );
}

void *add_task(void *arg){  // 存款任务
    int num = 0;
    for(int i=0;i<5;i++){
        // 申请加锁
        pthread_mutex_lock(&mlock);
        // 以下的操作的上下文是线程安全的，没有其它线程同时执行或修改共享资源
        num = rand() % 901 + 100;
        balance += num;
        showCurrentTime();
        printf("--存储 %d, 余额： %d--\n", num, balance);

        // 解锁
        pthread_mutex_unlock(&mlock);
        usleep(50);
    }
    return NULL;
}

void *sub_task(void *arg){  // 取款任务

    int num = 0;
    for(int i=0;i<5;i++){
        pthread_mutex_lock(&mlock);

        num = rand() % 901 + 100;
        showCurrentTime();
        if(balance >= num){
            balance -= num;
            printf("--取款 %d, 余额： %d--\n", num, balance);
        }else{
            printf("--取款 %d 失败, 余额不足： %d--\n", num, balance);
        }
        pthread_mutex_unlock(&mlock);
        usleep(100);
    }
    return NULL;
}

int main(int argc, char const *argv[])
{
    // 设置随机种子
    srand(time(NULL));

    pthread_t tid1, tid2;
    pthread_create(&tid1, NULL, add_task, NULL);
    pthread_create(&tid2, NULL, sub_task, NULL);

    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    printf("----存款余额: %d---\n", balance);

    // 销毁锁
    pthread_mutex_destroy(&mlock);

    return 0;
}


